
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
utils#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"

#include "test.h"

namespace skiatest
{

class MyReporter : public Reporter
    {
    protected:
        virtual void onStart(Test* test) {}
        virtual void onReport(const char desc[], Reporter::Result result)
            {
            SkASSERT(Reporter::kPassed == result);
            }
        virtual void onEnd(Test* test) {}
    };

class Iter
    {
    public:
        Iter(Reporter* r) : fReporter(r)
            {
            r->ref();
            fReg = TestRegistry::Head();
            }

        ~Iter()
            {
            fReporter->unref();
            }

        Test* next()
            {
            if (fReg)
                {
                TestRegistry::Factory fact = fReg->factory();
                fReg = fReg->next();
                Test* test = fact(NULL);
                test->setReporter(fReporter);
                return test;
                }
            return NULL;
            }

        static int Count()
            {
            const TestRegistry* reg = TestRegistry::Head();
            int count = 0;
            while (reg)
                {
                count += 1;
                reg = reg->next();
                }
            return count;
            }

    private:
        Reporter* fReporter;
        const TestRegistry* fReg;
    };
}

class TestsView : public SkView
    {
    public:
        TestsView() {}

    protected:
        // overrides from SkEventSink
        virtual bool onQuery(SkEvent* evt)
            {
            if (SampleCode::TitleQ(*evt))
                {
                SampleCode::TitleR(evt, "Tests");
                return true;
                }
            return this->INHERITED::onQuery(evt);
            }

        void drawBG(SkCanvas* canvas)
            {
            canvas->drawColor(SK_ColorWHITE);
            }

        virtual void onDraw(SkCanvas* canvas)
            {
            this->drawBG(canvas);

            skiatest::MyReporter reporter;
            skiatest::Iter iter(&reporter);
            skiatest::Test* test;

            while ((test = iter.next()) != NULL)
                {
                test->run();
                SkDELETE(test);
                }
            }

        virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
            {
            this->inval(NULL);

            return this->INHERITED::onFindClickHandler(x, y);
            }

        virtual bool onClick(Click* click)
            {
            this->inval(NULL);
            return this->INHERITED::onClick(click);
            }

        virtual bool handleKey(SkKey key)
            {
            this->inval(NULL);
            return true;
            }

    private:
        typedef SkView INHERITED;
    };

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory()
    {
    return new TestsView;
    }
static SkViewRegister reg(MyFactory);

